
使用模板编程的复杂性，很大程度上来源于编译器无法在本地检查模板定义是否正确。相反，模板的大多数检查发生在模板实例化期间，此时模板定义上下文和模板实例化上下文交织在一起。这种不同上下文的混合使得很难进行分配。这是模板定义的错误，因为不正确地使用了模板参数？还是模板用户的错误，还是提供的模板参数不符合模板的要求？这个问题可以用一个简单的例子来说明，我们用一个常规编译器产生的错误信息进行了注释:

\begin{lstlisting}[style=styleCXX]
template<typename T>
T max(T a, T b)
{
	return b < a ? a : b; // ERROR: “no match for operator <
	// (operator types are ’X’ and ’X’)”
}

struct X {
};
bool operator> (X, X);

int main()
{
	X a, b;
	X m = max(a, b); // NOTE: “in instantiation of function template specialization
					// ’max<X>’ requested here”
}
\end{lstlisting}

实际的错误(缺少合适的小于操作符)是在函数模板max()的定义中检测到的。这可能是真正的错误——也许max()应该使用大于操作符代替?但编译器还提供了一个信息，指出了max<X>实例化的位置，这可能才是真正的错误——也许max()在文档中需要小于操作符？无法回答这个问题的话，会出现在第9.4节中提到的“错误小说”，其中编译器提供了从初始化到检测到错误模板定义的整个模板实例化历史。然后，开发者需要确定哪个模板定义(或者模板的原始使用)出现了错误。

模板类型检查背后的思想是，在模板本身中描述模板的需求。这样，编译器就可以在编译失败时判断是模板定义问题，还是模板使用出了问题。解决这个问题的方法是使用概念将模板的需求描述为模板签名的一部分:

\begin{lstlisting}[style=styleCXX]
template<typename T> requires LessThanComparable<T>
T max(T a, T b)
{
	return b < a ? a : b;
}

struct X { };
bool operator> (X, X);

int main()
{
	X a, b;
	X m = max(a, b); // ERROR: X does not meet the LessThanComparable requirement
}
\end{lstlisting}

通过描述模板参数T上的需求，编译器能够确保函数模板max()只使用用户期望提供的T上的操作(LessThanComparable描述了小于操作符的需求)。使用模板时，编译器可以检查所提供的模板参数是否提供了max()函数模板正常工作所需的行为。通过分离类型检查问题，编译器可以更容易地提供准确的诊断信息。

上面的例子中，LessThanComparable称为概念:表示编译器可以检查的类型上的约束(更一般的情况下，是一组类型上的约束)。概念系统可以以不同的方式进行设计。

C++11标准制定过程中，一个精心设计并实现的系统的概念足够强大，可以检查模板的实例化点和模板的定义。上面的例子中，前者意味着main()中的错误可以更早的发现，诊断出X不满足LessThanComparable的约束。后者在处理max()模板时，编译器检查是否使用了LessThanComparable概念不允许的操作(若违反了该约束，则会发出诊断信息)。出于各种实际的考虑，C++11提案最终从语言规范中删除了概念(例如，仍然有许多小的规范问题，这些问题的解决会威胁到已经延迟发布的标准)。

C++11最终发布后，委员会成员提出了一个新的提案(最初称为精简概念)并进行了开发。这个系统的目的不是基于模板所附带的约束来检查模板的正确性，它只关注实例化点。因此，若在我们的示例中使用大于操作符实现max()，此时不会发出错误。但是，由于X不满足LessThanComparable的约束，在main()中仍然会发出错误。新版概念提案实现，并在所谓的概念TS(TS代表技术规范)中指定，称为概念的C++扩展。

\begin{tcolorbox}[colback=webgreen!5!white,colframe=webgreen!75!black]
\hspace*{0.75cm}例如，2017年初的概念TS版本的N4641。
\end{tcolorbox}

目前，该技术规范的基本已经集成到下一个标准的草案中(预计进入C++20)。附录E涵盖了本书付印时草稿中规定的语言特性。














































